﻿Imports StandAuto.Models

Public Class FormVeiculos
    Private Property askToSave As Boolean
    Private Sub FormViaturas_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        'mapear o evento para se sempre a mesma função a responder as mudancas de texto 
        'o que se pretende é marcar uma alteração para depois se alguem quiser mudar a viatura selecionada
        'antes de guardar as alterações é avisado de perder as alterações
        Me.GrpDadosAuto.Controls.OfType(Of TextBox).ToList().ForEach(Function(z)
                                                                         AddHandler z.TextChanged, AddressOf Me.TxtMarkAskToSave_TextChanged
                                                                         Return True
                                                                     End Function)

        Inicializa()
    End Sub
    Private Sub Inicializa()
        'carrega a lista das viaturas
        Dim veiculos As IEnumerable(Of Veiculo) = AcessoCamadaDeDados.GetAllViaturas()

        DataGridView1.DataSource = veiculos

        'Vamos adionar as marcas distintas á combobox das marcas
        cmbMarcas.Items.AddRange(
            veiculos.Select(Function(z) z.Marca.ToUpper).Distinct().ToArray
            )

    End Sub


    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        DataGridView1.DataSource = Utilitarios.BuscarListaPesquisada(Of Veiculo)(AcessoCamadaDeDados.GetAllViaturas(), TextBoxPesquisaVeiculos.Text)

    End Sub
    Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBoxPesquisaVeiculos.KeyPress
        If e.KeyChar = vbCr Then
            Button1.PerformClick()
        End If
    End Sub
    Private Sub MapVeiculo(veiculo As Veiculo)

        txtVeiculoId.Text = veiculo.Id
        TxtValorVenda.Text = veiculo.valorVenda
        TxtPotencia.Text = veiculo.potencia
        cmbMarcas.Text = veiculo.Marca
        cmbMarcas_Leave(Nothing, Nothing)
        cmbModelos.Text = veiculo.Modelo
        TxtDescricao.Text = veiculo.descricao
        TxtCilindrada.Text = veiculo.cilindrada
        NumUpDnPortas.Value = veiculo.numPortas
        'vamos preencher as vendas e as compras deste veiculo
        DataGridViewVendas.DataSource = AcessoCamadaDeDados.GetAllVendasByVeiculo(veiculo.Id).ToList()
        DataGridViewCompras.DataSource = AcessoCamadaDeDados.GetAllComprasByVeiculo(veiculo.Id).ToList()

        'esta função so é chamada quando se muda de veiculo por isso no final vamos colocar 
        'o askToSave=false sempre pois esta variavel so deve ficar a true se houver alterações diretas pelo utilizador
        askToSave = False



    End Sub

    Private Sub DataGridView1_Click(sender As Object, e As EventArgs) Handles DataGridView1.Click

        'verificar se temos algo a perguntar antes de mudar o veiculo selecionado
        If askToSave Then
            askToSave = MessageBox.Show("Há alterações ao veiculo, se continuar vai perder os dados alterados. " + vbCrLf + "Deseja continuar?", "Alteração de dados de veiculo:", MessageBoxButtons.YesNo) = DialogResult.No
        End If
        If Not askToSave Then
            Dim veiculo As Veiculo
            Dim dtGridView As DataGridView = CType(sender, DataGridView)
            Try
                Dim rowindex = dtGridView.CurrentCell.RowIndex
                veiculo = CType(dtGridView.DataSource()(rowindex), Veiculo)
                MapVeiculo(veiculo)
            Catch ex As Exception
                Dim result As DialogResult = MessageBox.Show("Nao conseguimos mapear totalmente os dados do veiculo devido a:" + vbCrLf + ex.Message, "Ocurreu um erro:", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Exclamation)
                Select Case result
                    Case DialogResult.Abort
                        Me.Close()
                    Case DialogResult.Retry
                        DataGridView1_Click(sender, e)
                End Select
            End Try
        End If
    End Sub

    Private Sub TxtMarkAskToSave_TextChanged(sender As Object, e As EventArgs)
        askToSave = True
    End Sub


    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles BtnEliminarVenda.Click
        Try
            Dim venda As Venda
            venda = DataGridViewVendas.DataSource()(DataGridViewVendas.CurrentCell.RowIndex)
            If (MessageBox.Show("Deseja eliminar a venda " + venda.ToString() + " ?", "Eliminar venda.", MessageBoxButtons.YesNo) = DialogResult.Yes) Then
                AcessoCamadaDeDados.RemoveVenda(venda)
            End If
        Catch ex As Exception

        End Try
    End Sub

    Private Sub BtnEliminaCompra_Click(sender As Object, e As EventArgs) Handles BtnEliminarCompra.Click
        Try
            Dim compra As Compra
            compra = DataGridViewCompras.DataSource()(DataGridViewCompras.CurrentCell.RowIndex)
            If (MessageBox.Show("Deseja eliminar a compra " + compra.ToString() + " ?", "Eliminar compra.", MessageBoxButtons.YesNo) = DialogResult.Yes) Then
                AcessoCamadaDeDados.RemoveCompra(compra)
            End If
        Catch ex As Exception

        End Try
    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Dim frmTrans As New FormTransacao()

        If IsNumeric(txtVeiculoId.Text) Then
            If AcessoCamadaDeDados.ExisteVeiculo(CInt(txtVeiculoId.Text)) Then
                frmTrans.veiculo = AcessoCamadaDeDados.GetViatura(CInt(txtVeiculoId.Text))
            End If
            frmTrans.isVenda = True
            frmTrans.ShowDialog()
            DataGridViewVendas.DataSource = AcessoCamadaDeDados.GetAllVendasByVeiculo(txtVeiculoId.Text).ToList()
            DataGridViewCompras.DataSource = AcessoCamadaDeDados.GetAllComprasByVeiculo(txtVeiculoId.Text).ToList()
        End If
    End Sub

    Private Sub Button6_Click_1(sender As Object, e As EventArgs) Handles Button6.Click
        txtVeiculoId.Text = "(novo)"
    End Sub

    Private Sub BtnGuardar_Click(sender As Object, e As EventArgs) Handles BtnGuardar.Click
        AcessoCamadaDeDados.GuardarVeiculo(New Veiculo With {.cilindrada = TxtCilindrada.Text,
                                           .descricao = TxtDescricao.Text,
                                           .Id = IIf(String.IsNullOrWhiteSpace(txtVeiculoId.Text) Or txtVeiculoId.Text = "(novo)", -1, txtVeiculoId.Text),
                                           .Marca = cmbMarcas.Text,
                                           .Modelo = cmbModelos.Text,
                                           .numPortas = NumUpDnPortas.Value,
                                           .potencia = TxtPotencia.Text,
                                           .valorVenda = TxtValorVenda.Text})
        MessageBox.Show("Dados guardados com sucesso.", "Guardar dados.", MessageBoxButtons.OK)
        askToSave = False
        DataGridView1.DataSource = AcessoCamadaDeDados.GetAllViaturas()
    End Sub

    Private Sub Button10_Click(sender As Object, e As EventArgs) Handles Button10.Click
        Dim frmTrans As New FormTransacao()

        If (Not String.IsNullOrEmpty(txtVeiculoId.Text)) Then
            If AcessoCamadaDeDados.ExisteVeiculo(CInt(txtVeiculoId.Text)) Then
                frmTrans.veiculo = AcessoCamadaDeDados.GetViatura(CInt(txtVeiculoId.Text))
            End If
        End If
        frmTrans.ShowDialog()
        DataGridViewVendas.DataSource = AcessoCamadaDeDados.GetAllVendasByVeiculo(txtVeiculoId.Text).ToList()
        DataGridViewCompras.DataSource = AcessoCamadaDeDados.GetAllComprasByVeiculo(txtVeiculoId.Text).ToList()

    End Sub

    Private Sub cmbMarcas_Leave(sender As Object, e As EventArgs) Handles cmbMarcas.Leave
        cmbModelos.Items.Clear()
        If Not String.IsNullOrWhiteSpace(cmbMarcas.Text) Then
            Dim modelos As IEnumerable(Of String) = AcessoCamadaDeDados.GetAllViaturas.
                Where(Function(z) z.Marca.EqualsIgnoreCase(cmbMarcas.Text)).
                Select(Of String)(Function(z) z.Modelo.ToUpper).Distinct.ToArray 
            If (modelos.Any()) Then
                cmbModelos.Items.AddRange(modelos)
            End If
        End If
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim url As String = AcessoCamadaDeDados.getSetting("URLREPORT")
        If Not String.IsNullOrWhiteSpace(txtVeiculoId.Text) Or txtVeiculoId.Text = "(novo)" Then
            System.Diagnostics.Process.Start(url & "/Transacao/Vendasbyveiculo/" + txtVeiculoId.Text)
        End If
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        Dim url As String = AcessoCamadaDeDados.getSetting("URLREPORT")
        If Not String.IsNullOrWhiteSpace(txtVeiculoId.Text) Or txtVeiculoId.Text = "(novo)" Then
            System.Diagnostics.Process.Start(url & "/Transacao/comprasbyveiculo/" + txtVeiculoId.Text)
        End If
    End Sub

    Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
        If IsNumeric(txtVeiculoId.Text) Then
            'vendas
            DataGridViewVendas.DataSource = Utilitarios.BuscarListaPesquisada(Of Venda)(AcessoCamadaDeDados.GetAllVendasByVeiculo(txtVeiculoId.Text).ToList(), TextBox1.Text)
            'compras
            DataGridViewCompras.DataSource = Utilitarios.BuscarListaPesquisada(Of Compra)(AcessoCamadaDeDados.GetAllComprasByVeiculo(txtVeiculoId.Text).ToList(), TextBox1.Text)
        End If
    End Sub

    Private Sub TextBox1_KeyPress_1(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
        If e.KeyChar = vbCr Then
            Button8.PerformClick()
        End If
    End Sub
End Class